package com.example.base_model.general

import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow

/**
 * @Author jiangKunKun
 * @CreateDate 2025/7/28
 * @Description 一个通用的、基于 Kotlin `StateFlow` 的状态容器类。
 * 它封装了一个可变的状态，并将其作为不可变的、可观察的数据流暴露出来，
 * 以便在 UI 或其他组件中安全地订阅状态变化。
 * @SpittingGrooves
 */
class StateChangeManager<T> private constructor(
    initialValue: T
) {
    /**
     * 内部可变的状态流，持有当前的状态值。
     */
    private val _state = MutableStateFlow(initialValue)

    /**
     * 对外暴露的不可变状态流 [StateFlow]，用于安全地观察状态变化。
     * 订阅者可以从这个 Flow 中收集状态更新。
     */
    val state: StateFlow<T> = _state.asStateFlow()

    /**
     * 同步获取当前的状态值。
     *
     * @return 当前存储的状态值 T。
     */
    fun getValue(): T = _state.value

    /**
     * 更新状态值。
     * [MutableStateFlow] 内部会比较新旧值，只有当新值与当前值不同时，才会通知观察者。
     *
     * @param value 新的状态值。
     */
    fun update(value: T) {
        _state.value = value
    }

    companion object {
        /**
         * 工厂方法，用于创建 [StateChangeManager] 的实例。
         *
         * @param T 状态的类型。
         * @param initialValue 状态的初始值。
         * @return 一个新的 [StateChange-Manager] 实例。
         */
        fun <T> of(initialValue: T): StateChangeManager<T> {
            return StateChangeManager(initialValue)
        }
    }
}
